package dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import model.Usuario;

class UsuarioDAO implements IUsuarioDAO {

	@Override
	public boolean insert(Usuario u) {
		String sql = "insert into usuario (login, senha, nome, dt_cadastro, dt_alteracao, usuario_alteracao) values (?,?,?,?,?,?);";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, u.getLogin() );
			ps.setObject(2, u.getSenha() );
			ps.setObject(3, u.getNome() );
			ps.setObject(4, u.getDt_cadastro() );
			ps.setObject(5, u.getDt_alteracao() );
			ps.setObject(6, u.getUsuario_alteracao() );
			
			return ps.executeUpdate() > 0;
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return false;
	}

	@Override
	public boolean update(Usuario u) {
		String sql = "update usuario set login = ?, senha = ?, nome = ?, dt_cadastro = ?, dt_alteracao = ?, usuario_alteracao = ? where id_usuario = ?";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, u.getLogin() );
			ps.setObject(2, u.getSenha() );
			ps.setObject(3, u.getNome() );
			ps.setObject(4, u.getDt_cadastro() );
			ps.setObject(5, u.getDt_alteracao() );
			ps.setObject(6, u.getUsuario_alteracao() );
			ps.setObject(7, u.getId_usuario() );

			return ps.executeUpdate() > 0;
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return false;
	}

	@Override
	public boolean delete(Usuario u) {
		String sql = "delete from usuario where id_usuario = ?";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, u.getId_usuario() );
			
			return ps.executeUpdate() > 0;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return false;
	}

	@Override
	public Usuario findById(int id) {
		String sql = "select * from usuario where id_usuario = ?";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, id );
			
			ResultSet rs = ps.executeQuery();
			
			return rs.next() ? 
					new Usuario(rs.getInt("id_usuario"),
								rs.getString("login"),
								rs.getString("senha"),
								rs.getString("nome"),
								rs.getDate("dt_cadastro"),
								rs.getDate("dt_alteracao"),
								rs.getString("usuario_alteracao")) : null;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return null;
	}

	@Override
	public List<Usuario> findAll() {
		List<Usuario> usuarios = new ArrayList<Usuario>();
		String sql = "select * from usuario";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			
			ResultSet rs = ps.executeQuery();
			
			while ( rs.next() ) {
				usuarios.add(					
					new Usuario(rs.getInt("id_usuario"),
								rs.getString("login"),
								rs.getString("senha"),
								rs.getString("nome"),
								rs.getDate("dt_cadastro"),
								rs.getDate("dt_alteracao"),
								rs.getString("usuario_alteracao"))
				);
			} 
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return usuarios;
	}


	
	/* (non-Javadoc)
	 * @see dao.IUsuarioDAO#findUsuarioByLoginOrName(java.lang.String)
	 */
	@Override
	public List<Usuario> findUsuarioByLoginOrName(String searchString) {
		List<Usuario> usuarios = new ArrayList<Usuario>();
		String sql = "select * from usuario where login like ? or nome like ?";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			CallableStatement cs = conn.prepareCall(sql);
			cs.setObject(1, searchString + '%' );
			cs.setObject(2, searchString + '%' );
			
			ResultSet rs = cs.executeQuery();
			
			while ( rs.next() ) {
				usuarios.add( 
					new Usuario(rs.getInt("id_usuario"),
								rs.getString("login"),
								rs.getString("senha"),
								rs.getString("nome"),
								rs.getDate("dt_cadastro"),
								rs.getDate("dt_alteracao"),
								rs.getString("usuario_alteracao"))
				);
			} 
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return usuarios;
	}

	/* (non-Javadoc)
	 * @see dao.IUsuarioDAO#findUsuarioByLogin(java.lang.String)
	 */
	@Override
	public List<Usuario> findUsuarioByLogin(String login) {
		List<Usuario> usuarios = new ArrayList<Usuario>();
		String sql = "select * from usuario where login like ?";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			CallableStatement cs = conn.prepareCall(sql);
			cs.setObject(1, login + '%' );
			
			ResultSet rs = cs.executeQuery();
			
			while ( rs.next() ) {
				usuarios.add( 
					new Usuario(rs.getInt("id_usuario"),
								rs.getString("login"),
								rs.getString("senha"),
								rs.getString("nome"),
								rs.getDate("dt_cadastro"),
								rs.getDate("dt_alteracao"),
								rs.getString("usuario_alteracao"))
				);
			} 
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return usuarios;
	}

	/* (non-Javadoc)
	 * @see dao.IUsuarioDAO#findUsuarioByName(java.lang.String)
	 */
	@Override
	public List<Usuario> findUsuarioByName(String name) {
		List<Usuario> usuarios = new ArrayList<Usuario>();
		String sql = "select * from usuario where name like ?";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			CallableStatement cs = conn.prepareCall(sql);
			cs.setObject(1, name + '%' );
			
			ResultSet rs = cs.executeQuery();
			
			while ( rs.next() ) {
				usuarios.add( 
					new Usuario(rs.getInt("id_usuario"),
								rs.getString("login"),
								rs.getString("senha"),
								rs.getString("nome"),
								rs.getDate("dt_cadastro"),
								rs.getDate("dt_alteracao"),
								rs.getString("usuario_alteracao"))
				);
			} 
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return usuarios;
	}

	/* (non-Javadoc)
	 * @see dao.IUsuarioDAO#findAllUsuarios()
	 */
	@Override
	public List<Usuario> findAllUsuarios() {
		List<Usuario> usuarios = new ArrayList<Usuario>();
		String sql = "select * from usuario;";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			CallableStatement cs = conn.prepareCall(sql);
			
			ResultSet rs = cs.executeQuery();
			
			while ( rs.next() ) {
				usuarios.add( 
					new Usuario(rs.getInt("id_usuario"),
								rs.getString("login"),
								rs.getString("senha"),
								rs.getString("nome"),
								rs.getDate("dt_cadastro"),
								rs.getDate("dt_alteracao"),
								rs.getString("usuario_alteracao"))
				);
			} 
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return usuarios;
	}
}
